package com.qishao.edu_service;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * Redis 常见问题解决方案Dome
 * @Title：RedisDome.java
 * @Author：XUSHAOQI
 * @DATE：2022/3/10
 */
public class RedisDome {
    //拿到互斥锁对象
    static Lock reenLock = new ReentrantLock();


    /**
     * 使用互斥锁解决 Redis缓存击穿问题
     * @return
     * @throws InterruptedException
     */
    public List<String> getData04() throws InterruptedException {

        List<String> result = new ArrayList<String>();
        // 从缓存读取数据
        result = getDataFromCache();
        if (result.isEmpty()) {
            //加锁
            if (reenLock.tryLock()) {
                try {
                    System.out.println("拿到锁了,从DB获取数据库后写入缓存");
                    // 从数据库查询数据
                    result = getDataFromDB();
                    // 将查询到的数据写入缓存
                    setDataToCache(result);
                } finally {
                    reenLock.unlock();// 释放锁
                }

            } else {
                result = getDataFromCache();// 先查一下缓存
                if (result.isEmpty()) {
                    System.out.println("我没拿到锁,缓存也没数据,先小憩一下");
                    Thread.sleep(100);// 小憩一会儿
                    return getData04();// 重试
                }
            }
        }
        return result;
    }

    private List<String> getDataFromDB() {
        return null;
    };

    private void setDataToCache(List<String> result) {
    };

    private List<String> getDataFromCache() {
        return null;
    };


}
